#include <stdlib.h>
#include <stdio.h>
#include<pthread.h>


//structure permettant de mettre les parametres necessaires
//en argument de la fonction du thread
struct args{ 
  int * tab; 
  int premier;
  int dernier;
};

void * tri_rapide_thread(void  * args_void){
  //cast
  struct args * args=(struct args *) args_void;
 int premier=args->premier;
  int gauche=args->premier;

  int droite=args->dernier;
  int dernier=args->dernier;


  if(args->premier<args->dernier){

    int compteur=args->premier; 
    int pivot=args->tab[args->premier];
    int i;
  /*  for(i=args->premier+1;i<=args->dernier;i++){
      if(args->tab[i]<pivot){
	compteur++;
	int tmp=args->tab[compteur];
	args->tab[compteur]=args->tab[i];
	args->tab[i]=tmp;
      }}*/
	while(1){
		do droite--; while(args->tab[droite]>pivot);
		do gauche++; while(args->tab[gauche]<pivot);
		if(gauche<droite){
			int temp=args->tab[droite];
      			args->tab[droite]=args->tab[gauche];
      			args->tab[gauche]=temp;
		}
		else{
			int temp2=pivot;
      			args->tab[compteur]=args->tab[gauche-1];
      			args->tab[gauche-1]=pivot;

			break;
		}
    	} 
	
	 struct args args1={args->tab,premier,gauche-1};
 	 struct args args2={args->tab,gauche,dernier};
 
    pivot=compteur;
    
  
  thread_t thread1,thread2;

  thread_create(&thread1,tri_rapide_thread,(void *)(&args1));
  thread_create(&thread2,tri_rapide_thread,(void *)(&args2));
   thread_join(thread1,NULL);
   thread_join(thread2,NULL);
  }
thread_exit(0);
  return NULL;
  }

int main(){
  int i, premier=0, dernier=19;
  int t[]={3,5,9,1,2,6,12,8,6,7,8,-6,-7,10,-1,29,49,-56,3,12};
  //  int t[]={2,10,11,4,6,7,1,8,5,3};
  printf("Tri rapide\ntableau de depart :\n[ ");
  for(i=0;i<=dernier;i++)
    printf("%d ",t[i]);
  printf("]\n");
  struct args *args=malloc(sizeof(struct args));
	args->tab=t;
	args->premier=premier;
	args->dernier=dernier;

  thread_t thread0;
  thread_create(&thread0,tri_rapide_thread,(void *)(args));  
   thread_join(thread0,NULL);
  printf("tableau trie :\n[ ");
  for(i=0;i<=dernier;i++)
    printf("%d ",t[i]);
  printf("]\n");
  return 0;
}
